home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue26 / survive / READER1.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-08-21  |  10.3 KB  |  357 lines

  1. unit Reader1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   DB, MyDS, StdCtrls, TypInfo, MyTable, ComCtrls, ExtCtrls, DBCtrls, Grids,
  8.   DBGrids, DBTables, DBClient;
  9.  
  10. type
  11.   PTestRec = ^TTestRec;
  12.   TTestRec = packed record
  13.       DelFlag: Byte;
  14.       EmpNo: SmallInt;
  15.       FirstName: string[15];
  16.       LastName: string[20];
  17.       HireDate: TDateTime;
  18.       DeptNo: string[3];
  19.       Salary: Double;
  20.       NullFlags: LongInt;
  21.     end;
  22.  
  23.   TForm1 = class(TForm)
  24.     btnTest: TButton;
  25.     btnClose: TButton;
  26.     MyTable1: TMyTable;
  27.     PageControl1: TPageControl;
  28.     TabSheet1: TTabSheet;
  29.     TabSheet2: TTabSheet;
  30.     Memo1: TMemo;
  31.     btnTest2: TButton;
  32.     DataSource1: TDataSource;
  33.     DBGrid1: TDBGrid;
  34.     DBNavigator1: TDBNavigator;
  35.     Table1: TTable;
  36.     MyTable1EmpNo: TSmallintField;
  37.     MyTable1FirstName: TStringField;
  38.     MyTable1LastName: TStringField;
  39.     MyTable1HireDate: TDateTimeField;
  40.     MyTable1DeptNo: TStringField;
  41.     MyTable1Salary: TFloatField;
  42.     MyTable1CalcField: TIntegerField;
  43.     Database1: TDatabase;
  44.     procedure btnTest1Click(Sender: TObject);
  45.     procedure btnCloseClick(Sender: TObject);
  46.     procedure btnTest2Click(Sender: TObject);
  47.     procedure FormCreate(Sender: TObject);
  48.     procedure MyTable1CalcFields(DataSet: TDataSet);
  49.   private
  50.   public
  51.     procedure DumpCurrentRec1;
  52.     procedure DumpCurrentRec2;
  53.   end;
  54.  
  55. var
  56.   YesNo: array[Boolean] of Char = ('N', 'Y');
  57.   Form1: TForm1;
  58.  
  59. implementation
  60.  
  61. {$R *.DFM}
  62.  
  63. procedure TForm1.DumpCurrentRec1;
  64. var
  65.   RecBuffer: TTestRec;
  66. begin
  67.   if MyTable1.GetCurrentRecord(@RecBuffer) then
  68.     with RecBuffer do
  69.       Memo1.Lines.Add(Format('%3d %3d %-15s %-20s %10s %3s %11.0m',
  70.                              [MyTable1.RecNo, EmpNo, FirstName,
  71.                               LastName, DateToStr(HireDate),
  72.                               DeptNo, Salary])
  73.                      );
  74. end;
  75.  
  76. procedure TForm1.DumpCurrentRec2;
  77. begin                             
  78.   with MyTable1 do begin
  79.     Memo1.Lines.Add(Format('%3d %3d %-15s %-20s %10s %3s %11.0m %3d',
  80.                            [RecNo,
  81.                             FieldByName('EmpNo').AsInteger,
  82.                             FieldByName('FirstName').AsString,
  83.                             FieldByName('LastName').AsString,
  84.                             DateToStr(FieldByName('HireDate').AsDateTime),
  85.                             FieldByName('DeptNo').AsString,
  86.                             FieldByName('Salary').AsFloat,
  87.                             FieldByName('CalcField').AsInteger])
  88.                    );
  89.   end;
  90. end;                                       
  91.  
  92. procedure TForm1.btnTest1Click(Sender: TObject);
  93. var
  94.   BookmarkA,
  95.   BookmarkB: TBookmark;
  96.   I: Integer;
  97.   SaveDept: ShortString;
  98. begin
  99.   PageControl1.ActivePage := TabSheet1;
  100.   with MyTable1 do begin
  101. (*
  102.     Open;
  103.     try
  104.       Memo1.Lines.Add('Active = ' + IntToStr(Ord(Active)));
  105.       Memo1.Lines.Add('RecordCount = ' + IntToStr(RecordCount));
  106.       Memo1.Lines.Add('RecordSize = ' + IntToStr(RecordSize));
  107.  
  108.       Memo1.Lines.Add('');
  109.       Memo1.Lines.Add('*** Read to EOF forwards ***');
  110.       First;
  111.       while not Eof do begin
  112.         DumpCurrentRec1;
  113.         Next;
  114.       end;
  115.  
  116.       Memo1.Lines.Add('');
  117.       Memo1.Lines.Add('*** Read to BOF backwards ***');
  118.       Last;
  119.       while not Bof do begin
  120.         DumpCurrentRec1;
  121.         Prior;
  122.       end;
  123.  
  124.       Memo1.Lines.Add('');
  125.       Memo1.Lines.Add('*** Test MoveBy ***');
  126.       First;
  127.       MoveBy(10);
  128.       DumpCurrentRec1;
  129.       MoveBy(-5);
  130.       DumpCurrentRec1;
  131.  
  132.       Memo1.Lines.Add('');
  133.       Memo1.Lines.Add('*** Test Bookmarks ***');
  134.       First;
  135.       MoveBy(10);
  136.       Memo1.Lines.Add('Goto this record and bookmark it:');
  137.       DumpCurrentRec1;
  138.       BookmarkA := GetBookmark;
  139.       try
  140.         MoveBy(-5);
  141.         Memo1.Lines.Add('Then move to a different record:');
  142.         DumpCurrentRec1;
  143.         BookmarkB := GetBookmark;
  144.         try
  145.           if BookmarkValid(BookmarkA) then begin
  146.             GotoBookmark(BookmarkA);
  147.             Memo1.Lines.Add('Then return to bookmarked record:');
  148.             DumpCurrentRec1;
  149.           end;
  150.  
  151.           Memo1.Lines.Add('Compare two different bookmarks (0=same, 1=different): ' +
  152.                           IntToStr(CompareBookmarks(BookmarkA, BookmarkB)));
  153.           Memo1.Lines.Add('Compare two identical bookmarks (0=same, 1=different): ' +
  154.                           IntToStr(CompareBookmarks(BookmarkA, BookmarkA)));
  155.           Memo1.Lines.Add('Compare two nil bookmarks (0=same, 1=different): ' +
  156.                           IntToStr(CompareBookmarks(nil, nil)));
  157.         finally
  158.           FreeBookmark(BookmarkB);
  159.         end;
  160.       finally
  161.         FreeBookmark(BookmarkA);
  162.       end;
  163.  
  164.       Memo1.Lines.Add('');
  165.       Memo1.Lines.Add('*** Test Insert ***');
  166.       Insert;
  167.       try
  168.         with PTestRec(ActiveBuffer)^ do begin
  169.           EmpNo := 444;
  170.           FirstName := 'NewGuy';
  171.           LastName := 'Inserted';
  172.           HireDate := Date;
  173.           DeptNo := '621';
  174.           Salary := 100000;
  175.         end;
  176.         Post;
  177.       except
  178.         Cancel;
  179.       end;
  180.       Last;
  181.       DumpCurrentRec1;
  182.  
  183.       Memo1.Lines.Add('');
  184.       Memo1.Lines.Add('*** Test Append ***');
  185.       Append;
  186.       try
  187.         with PTestRec(ActiveBuffer)^ do begin
  188.           EmpNo := 445;
  189.           FirstName := 'NewGuy';
  190.           LastName := 'Appended';
  191.           HireDate := Date;
  192.           DeptNo := '621';
  193.           Salary := 100000;
  194.         end;
  195.         Post;
  196.       except
  197.         Cancel;
  198.       end;
  199.       Last;
  200.       DumpCurrentRec1;
  201.  
  202.       Memo1.Lines.Add('');
  203.       Memo1.Lines.Add('*** Test Update ***');
  204.       Last;
  205.       Memo1.Lines.Add('Rec Before Update:');
  206.       DumpCurrentRec1;
  207.       Edit;
  208.       try
  209.         with PTestRec(ActiveBuffer)^ do
  210.           Salary := Salary + 1000;
  211.         Post;
  212.       except
  213.         Cancel;
  214.       end;
  215.       Memo1.Lines.Add('Rec After Update:');
  216.       DumpCurrentRec1;
  217.  
  218.       Memo1.Lines.Add('');
  219.       Memo1.Lines.Add('*** Test Delete ***');
  220.       First;
  221.       MoveBy(2);
  222.       Memo1.Lines.Add('Current Record Before Delete:');
  223.       DumpCurrentRec1;
  224.       Delete;
  225.       Memo1.Lines.Add('Current Record After Delete:');
  226.       DumpCurrentRec1;
  227.       MoveBy(-1);
  228.       Memo1.Lines.Add('Current Record Before Delete:');
  229.       DumpCurrentRec1;
  230.       Delete;
  231.       Memo1.Lines.Add('Current Record After Delete:');
  232.       DumpCurrentRec1;
  233.     finally
  234.       Close;
  235.     end;
  236. *)
  237.     Open;
  238.     try
  239.       Memo1.Lines.Add('Active = ' + IntToStr(Ord(Active)));
  240.       Memo1.Lines.Add('RecordCount = ' + IntToStr(RecordCount));
  241.       Memo1.Lines.Add('RecordSize = ' + IntToStr(RecordSize));
  242.  
  243.       Memo1.Lines.Add('');
  244.       Memo1.Lines.Add('*** Test FieldDefs ***');
  245.       Memo1.Lines.Add('Number of Fields: ' + IntToStr(FieldDefs.Count));
  246.       Memo1.Lines.Add('');
  247.       Memo1.Lines.Add('NO NAME       DATATYPE     SIZE REQ');
  248.       for I := 0 to FieldDefs.Count - 1 do
  249.         with Memo1.Lines, FieldDefs[I] do
  250.           Add(Format('%2d %-10s %-12s %3d   %s',
  251.                      [FieldNo,
  252.                       Name,
  253.                       GetEnumName(TypeInfo(TFieldType), Ord(DataType)),
  254.                       Size,
  255.                       YesNo[Required]]));
  256.  
  257.       Memo1.Lines.Add('');
  258.       Memo1.Lines.Add('*** Test Fields ***');
  259.       Memo1.Lines.Add('Number of Fields: ' + IntToStr(FieldCount));
  260.       Memo1.Lines.Add('');
  261.       Memo1.Lines.Add('NO NAME       DATATYPE     SIZE REQ');
  262.       for I := 0 to FieldCount - 1 do
  263.         with Memo1.Lines, Fields[I] do
  264.           Add(Format('%2d %-10s %-12s %3d   %s',
  265.                      [FieldNo,
  266.                       FieldName,
  267.                       GetEnumName(TypeInfo(TFieldType), Ord(DataType)),
  268.                       DataSize,
  269.                       YesNo[Required]]));
  270.  
  271.       Memo1.Lines.Add('');
  272.       Memo1.Lines.Add('*** Read to EOF forwards ***');
  273.       First;                       
  274.       while not Eof do begin
  275.         DumpCurrentRec2;
  276.         Next;
  277.       end;
  278.  
  279.       Memo1.Lines.Add('');
  280.       Memo1.Lines.Add('*** Test modifying field data ***');
  281.       Last;
  282.       Memo1.Lines.Add('Rec Before Update:');
  283.       DumpCurrentRec2;
  284.       Edit;
  285.       FieldByName('Salary').AsFloat := FieldByName('Salary').AsFloat + 1000;
  286.       Post;
  287.       First;  { Move the file pointer to prove the data is stored }
  288.       Last;
  289.       Memo1.Lines.Add('Rec After Update:');
  290.       DumpCurrentRec2;
  291.  
  292.       Memo1.Lines.Add('');
  293.       Memo1.Lines.Add('*** Test null field data ***');
  294.       Last;
  295.       Memo1.Lines.Add('Rec Before Update------DeptNo is null (0=no, 1=yes): ' +
  296.                       IntToStr(Ord(FieldByName('DeptNo').IsNull)));
  297.       DumpCurrentRec2;
  298.  
  299.       Edit;
  300.       SaveDept := FieldByName('DeptNo').AsString;
  301.       FieldByName('DeptNo').Clear;
  302.       Post;
  303.  
  304.       First;  { Move the file pointer to prove the data is stored }
  305.       Last;
  306.       Memo1.Lines.Add('Rec After Update-------DeptNo is null (0=no, 1=yes): ' +
  307.                       IntToStr(Ord(FieldByName('DeptNo').IsNull)));
  308.       DumpCurrentRec2;
  309.  
  310.       Edit;
  311.       FieldByName('DeptNo').AsString := SaveDept;
  312.       Post;
  313.  
  314.       First;  { Move the file pointer to prove the data is stored }
  315.       Last;
  316.       Memo1.Lines.Add('Reset Back to Nonnull--DeptNo is null (0=no, 1=yes): ' +
  317.                       IntToStr(Ord(FieldByName('DeptNo').IsNull)));
  318.       DumpCurrentRec2;
  319.  
  320.       Memo1.Lines.Add('');
  321.       Memo1.Lines.Add('*** Test InsertRecord ***');
  322.       InsertRecord([200, 'Steve', 'Troxell', Date, '000', 10000]);
  323.       DumpCurrentRec2;
  324.  
  325.       Memo1.Lines.Add('');
  326.       Memo1.Lines.Add('*** Test AppendRecord ***');
  327.       InsertRecord([201, 'Jane', 'Doe', Date, '001', 20000]);
  328.       DumpCurrentRec2;
  329.     finally                           
  330.       Close;
  331.     end;
  332.   end;
  333. end;
  334.  
  335. procedure TForm1.btnTest2Click(Sender: TObject);
  336. begin
  337.   PageControl1.ActivePage := TabSheet2;
  338.   DataSource1.DataSet.Open;
  339. end;
  340.  
  341. procedure TForm1.btnCloseClick(Sender: TObject);
  342. begin
  343.   Close;
  344. end;
  345.  
  346. procedure TForm1.FormCreate(Sender: TObject);
  347. begin
  348.   PageControl1.ActivePage := TabSheet1;
  349. end;
  350.  
  351. procedure TForm1.MyTable1CalcFields(DataSet: TDataSet);
  352. begin
  353.   MyTable1CalcField.AsInteger := MyTable1EmpNo.AsInteger * 2;
  354. end;
  355.  
  356. end.
  357.